import torch
import torch.nn as nn

# 词嵌入维度
d_model = 3
# 词汇表大小
vocab = 10
# 创建一个包含10个词的词嵌入(词汇表的长度)，每个词嵌入的维度为5（每个词的维度）
embedding_layer = nn.Embedding(num_embeddings=vocab, embedding_dim=d_model)
layer = embedding_layer(torch.tensor([1, 2, 3, 4]))
print(layer)
'''
tensor([[ 1.4720, -0.6000, -0.4937],    --->1的映射
        [ 0.3536, -1.4000, -0.0259],    --->2的映射
        [-0.5932,  0.1040, -2.0623],    --->3的映射
        [-1.1927,  0.5207, -0.0770]])   --->4的映射
'''

if __name__ == '__main__':
    print("over")

'''
无论是源文本嵌入还是目标文本嵌入，都是为了将文本中词汇的数字表示转变为向量表示, 希望在这样的高维空间捕捉词汇间的关系.

d_model=10表示词嵌入维度，当选取的维度过低时， 词嵌入 将有较大的偏差（high bias），因为模型丢失了较多信号。而维度过高时， 词嵌入的效果将会变差，因为模型会过度拟合训练数据，无法泛化到新的数据上

独热编码（One-Hot Encoding）和词嵌入（Word Embedding）是用于表示文本数据中词汇的两种不同方法。

独热编码：
    优点：
        简单直观：将每个词表示为一个稀疏的向量，只有一个元素为1，其余为0，非常直观。
        独立性：每个词的表示是相互独立的，不会受到其他词的影响。
    缺点：
        维度灾难：随着词汇量增加，独热编码的维度会呈指数增长，导致高维稀疏向量，增加了计算复杂度和内存消耗。
        无法表达词之间的语义关系：独热编码无法捕捉词之间的语义关系，每个词之间的距离是相等的。
词嵌入：
    优点：
        低维稠密表示：词嵌入将词汇映射到一个低维连续空间，提供了更加紧凑和连续的表示，降低了维度灾难。
        语义信息：词嵌入可以捕捉词汇之间的语义关系，使得相似的词在嵌入空间中距离更近。
    缺点：
        数据需求：词嵌入需要大量的文本数据进行训练，才能学习到有效的词向量表示。
        过拟合：在小数据集上容易过拟合，需要合适的正则化方法。
总的来说
    独热编码适合词汇量较小的情况，简单直观；而词嵌入适合大规模词汇量，能够更好地表达语义信息。在实际应用中，词嵌入更为常用，因为它能够更好地捕捉词汇之间的语义关系，提高了模型的性能和效率
'''
